#include <stdio.h>
#include <stdlib.h>

// 全局变量，存放在全局区
int global_var = 10;

// 未初始化的全局变量，存放在BSS区
int global_var_uninit;

// 静态变量，存放在全局区
static int static_var = 20;

// 未初始化的静态变量，存放在BSS区
static int static_var_uninit;

void func() {
    // 局部变量，存放在栈区
    int local_var = 30;
    printf("局部变量: %d\n", local_var);
}

int main() {
    // 局部变量，存放在栈区
    int local_var = 40;

    // 动态分配的内存，存放在堆区
    int *heap_var = (int *)malloc(sizeof(int));
    if (heap_var != NULL) {
        *heap_var = 50;
    }

    // 常量字符串，存放在常量区
    const char *const_str = "Hello, World!";

    printf("全局变量: %d\n", global_var);
    printf("未初始化的全局变量: %d\n", global_var_uninit);
    printf("静态变量: %d\n", static_var);
    printf("未初始化的静态变量: %d\n", static_var_uninit);
    printf("局部变量: %d\n", local_var);
    if (heap_var != NULL) {
        printf("堆区动态分配变量: %d\n", *heap_var);
        // 释放堆区内存，避免内存泄漏
        free(heap_var);
    }
    printf("常量字符串: %s\n", const_str);

    // 调用函数，观察栈区局部变量
    func();

    return 0;
}